package com.xy.type5;

/**
 * @author 谢阳
 * @version 1.8.0_131
 * @date 2022/6/9 19:07
 * @description 单例模式 ---> 懒汉式（线程安全 优化 双重检查机制）
 */
public class SingletonTest05 {
    public static void main(String[] args) {
        Singleton instance1 = Singleton.getInstance();
        Singleton instance2 = Singleton.getInstance();
        System.out.println(instance1 == instance2);
    }
}

class Singleton {
    // 对象的创建可能发生指令的重排序
    // 使用 volatile 可以禁止指令的重排序
    // 保证多线程环境内的系统安全。
    private static volatile Singleton instance;
    
    private Singleton() {}

    /**
     * 双重检查机制
     * @return
     */
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
